package GUI;

import java.awt.*;
import java.awt.event.*;

/**
 * @ClassName : FrameDemo
 * @Author : LV88VL
 * @Date: 2021/3/15 17:26
 * @Description : 窗口
 *          事件监听机制包括：
 *          外部动作：引发事件的动作------------->函数
 *          事件源：被动作的对象
 *          事件：事件源经历的事件--------------->每一个事件都有可以引发该时间的动作
 *                      而这些动作都被封装到监听器中
 *          监听器：用于监听可以引发某种事件的动作后，监听器采取相应措施
 *                      ---------------------->监听器接受到函数后，调用了自身方法来处理
 */
public class FrameDemo {
    public static void main(String[] args) {
        Frame   f =new Frame("my frame");
        //窗口的基本设置
        f.setSize(500,400);
        f.setLocation(400,200);
        //设置布局
        f.setLayout(new FlowLayout());
        //给窗口添加组件
        Button but = new Button("my button");
        //加入一个文本框组件
        TextField tf =new TextField(40);
        //将组件添加到窗口
        f.add(but);
        f.add(tf);

        /**
         * 需求：想要用户点击按钮有效果
         * 比如打印一句话
         * 思路：
         * 1.。确定事件源     按钮
         * 2.。确定监听器     按钮添加监听器
         * 3.。定义处理方式
         *
         * 定义的规范：XXXXListenXXXX监听器     ----------有对应的XXXEvent事件
         */

        //1.。在按钮上添加所需的监听器
        but.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                    System.out.println("按钮被触发");
            }
        });
        /**有适配器的监听接口：
         *      只要监听****接口****中的方法在2哥以内，都没有适配器
         *     · 一般的监听方法都有适配器
         *
         *     组件： .addXXXListener(new XXXAdapter)
         */

        /**
         *  需求：在窗体的X实现窗体的关闭
         *          1.。事件源：窗体
         *          2.。监听器：通过窗口对象去查找
         *          3.。事件处理
         * Windows窗口监听器
         *      实现点击Windows窗口按钮来实现功能  例如红色的X
         */
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }

            @Override
            public void windowOpened(WindowEvent e) {
                super.windowOpened(e);
                System.out.println("打开了");
            }
        });
        /**
         * 鼠标监听器
         *      将鼠标监听器注f册到按钮上
         */
        f.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                System.out.println("点击了");
            }

           /* @Override
            public void mouseExited(MouseEvent e) {
                super.mouseExited(e);
                Frame ff =new Frame();
                ff.setSize(250,200);
                ff.setLocation(200,100);
                //设置布局
                ff.setLayout(new FlowLayout());
                //给窗口添加组件
                Button butt = new Button("请重回鼠标位置");
                ff.add(butt);
                butt.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        super.mouseClicked(e);
                        System.exit(0);
                    }
                });
                ff.setVisible(true);
            }*/
        });
        /**
         * 需求：文本框中只能输入数字
         * 事件源：文本框
         * 文本注册键盘监听
         * 事件处理
         */
        tf.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                //1.。获取输入内容，通过键盘输入获取
                char key = e.getKeyChar();
                int code =e.getKeyCode();
                System.out.println(code+"***"+KeyEvent.getKeyText(code));
                if (!(code >= KeyEvent.VK_0&&code<=KeyEvent.VK_9) ) {
                    System.out.println("输入有误！！");
                    e.consume();
                }
            }
        });
        //显示窗口
        f.setVisible(true);
    }
}
